/**
*******************************************************
*@file  timer.c
*@brief timer.c
*@author 花满楼
*@date     2020-7-1 
*@version  V1
*@attention none
*******************************************************
*/
#include "timer.h"
#include "rs485.h"


TIM_HandleTypeDef TIM3_Handler;      //定时器句柄*/

u32 timer_count = 0;    ///<定时器计数值，范围0~0x‭BBF81E00‬,即可计数满1年
u8  timer_overflow = 0; ///<定时器计数溢出，表示已经计满1年
u8 timer_eep_1s = 0;    ///<用于记录计满1s的标志位，做数据存储用
u8 timer_soc_1s = 0;    ///<用于记录计满1s的标志位，做SOC的LED显示闪烁
u8 timer_alr_2s = 0;    ///<用于故障LED告警时候的闪烁
u8 timer_run_1s = 0;    ///<用于运行LED告警时候的闪烁
u8 timer_alr_0P75s = 0; ///<用于故障LED告警时候的闪烁 0.75s
/**
*******************************************************
*@brief 通用定时器3中断初始化
*@param   arr：自动重装值
*@param   psc：时钟预分频数
*@return  none
*@note
    定时器溢出时间计算方法:Tout=((arr+1)*(psc+1))/Ft us.
    Ft=定时器工作频率,单位:Mhz
    这里使用的是定时器3!(定时器3挂在APB1上，时钟为HCLK/2)
*******************************************************
*/
void TIM3_Init(u16 arr, u16 psc)
{
    TIM3_Handler.Instance = TIM3;                        //通用定时器3
    TIM3_Handler.Init.Prescaler = psc;                   //分频系数
    TIM3_Handler.Init.CounterMode = TIM_COUNTERMODE_UP;  //向上计数器
    TIM3_Handler.Init.Period = arr;                      //自动装载值
    TIM3_Handler.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; //时钟分频因子
    HAL_TIM_Base_Init(&TIM3_Handler);
    HAL_TIM_Base_Start_IT(&TIM3_Handler);    //使能定时器3和定时器3更新中断：TIM_IT_UPDATE
}

/**
*******************************************************
*@brief 定时器底册驱动，开启时钟，设置中断优先级
*@param   none
*@return  none
*@note    此函数会被HAL_TIM_Base_Init()函数调用
*******************************************************
*/
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
{
    if (htim->Instance == TIM3)
    {
        __HAL_RCC_TIM3_CLK_ENABLE();            //使能TIM3时钟
        HAL_NVIC_SetPriority(TIM3_IRQn, 2, 1);    //设置中断优先级，抢占优先级1，子优先级1
        HAL_NVIC_EnableIRQ(TIM3_IRQn);          //开启ITM3中断
    }
}


/**
*******************************************************
*@brief 定时器3中断服务函数
*@param   none
*@return  none
*@note    none
*******************************************************
*/
void TIM3_IRQHandler(void)
{
    HAL_TIM_IRQHandler(&TIM3_Handler);
}


/**
*******************************************************
*@brief 回调函数，定时器中断服务函数调用
*@param   none
*@return  none
*@note    none
*******************************************************
*/
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	u8 temp;//用于计时同步的中间变量
	
    if (htim == (&TIM3_Handler))
    {
        timer_count++;

        if (TIME_COUNT_YEAR <= timer_count) //计满1年
        {
            timer_count = 0;
            timer_overflow++;   //并没有实际的用途
        }

        if (0 == timer_count % TIME_COUNT_1S) //计满1s
        {
            timer_eep_1s = 1;       //eep存储
            timer_soc_1s = 1;       //SOC的LED显示
            timer_run_1s = 1;       //RUN的LED显示
        }

        if (0 == timer_count % TIME_COUNT_2S) //计满2s
        {
            timer_alr_2s = 1;
        }

        if (0 == timer_count % TIME_COUNT_0P75S) //计满0.75s
        {
            timer_alr_0P75s = 1;
        }
		/*为并联式ELD闪烁同步矫正计数器相关内容，即设计1s和0.75s计时
		*采用100和75的最小公倍数进行校正，计数器加上求余的值
		*/
		if(0x04==(Control_Reg.Control3.Word&0x04))
		{
			temp = timer_count%300;	//300对应着3s
			timer_count = timer_count +300-temp;
			Control_Reg.Control3.Word %= 0xFFFD;	//矫正标志位清零
		}
    }
}
